import os
import pandas as pd
import numpy as np
import openpyxl
from openpyxl.styles import Alignment, Font, PatternFill, Border, Side
from openpyxl.utils import get_column_letter


def filter_by_common_values(
    input_dir="input",
    output_dir="output",
    file1_name="表1.xlsx",
    file2_name="表2.xlsx",
    header_name="用户编号",
    output_file="相同数据筛选结果.xlsx",
):
    """
    对比两个Excel文件，根据指定表头字段筛选出相同值的行

    参数:
    - input_dir: 输入目录
    - output_dir: 输出目录
    - file1_name: 第一个表文件名（要筛选的表）
    - file2_name: 第二个表文件名（参考表）
    - header_name: 对比的表头字段名称
    - output_file: 输出文件名

    返回:
    - 输出文件路径
    """
    # 文件路径
    file1_path = os.path.join(input_dir, file1_name)
    file2_path = os.path.join(input_dir, file2_name)

    # 检查文件是否存在
    if not os.path.exists(file1_path):
        raise FileNotFoundError(f"文件不存在: {file1_path}")
    if not os.path.exists(file2_path):
        raise FileNotFoundError(f"文件不存在: {file2_path}")

    # 读取 Excel 文件
    try:
        df1 = pd.read_excel(file1_path, dtype=str)
        df2 = pd.read_excel(file2_path, dtype=str)
    except Exception as e:
        raise ValueError(f"读取 Excel 失败: {e}")

    # 检查对比表头是否存在
    if header_name not in df1.columns:
        raise ValueError(f"对比表头 '{header_name}' 在第一个表中不存在")
    if header_name not in df2.columns:
        raise ValueError(f"对比表头 '{header_name}' 在第二个表中不存在")

    # 获取第二个表中指定字段的值集合
    df2_values = set(df2[header_name].dropna().astype(str))

    print(f"第二个表中 '{header_name}' 字段共有 {len(df2_values)} 个唯一值")

    # 从第一个表中筛选出在第二个表中存在的记录
    filtered_df = df1[df1[header_name].astype(str).isin(df2_values)].copy()

    print(f"筛选完成: 第一个表中共找到 {len(filtered_df)} 条匹配记录")

    # 重新设置序号
    filtered_df = filtered_df.reset_index(drop=True)

    # 如果已有"序号"列，先删除再添加
    if "序号" in filtered_df.columns:
        filtered_df = filtered_df.drop("序号", axis=1)
    filtered_df.insert(0, "序号", range(1, len(filtered_df) + 1))

    # 定义需要添加的新列
    new_columns = {"是否上传照片": "", "止度是否正确": ""}

    # 添加新列，如果已存在则覆盖
    for col_name, default_value in new_columns.items():
        filtered_df[col_name] = default_value

    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    output_path = os.path.join(output_dir, output_file)

    # 保存结果并美化表格
    try:
        # 先保存数据
        filtered_df.to_excel(output_path, index=False, sheet_name="筛选结果")

        # 然后打开文件设置样式
        workbook = openpyxl.load_workbook(output_path)
        worksheet = workbook["筛选结果"]

        # 设置行高
        for row in range(2, len(filtered_df) + 2):  # 从第2行开始（跳过表头）
            worksheet.row_dimensions[row].height = 25

        # 设置表头行高和样式
        header_row = 1
        worksheet.row_dimensions[header_row].height = 30

        # 设置列宽自适应
        for idx, col in enumerate(filtered_df.columns, 1):
            column_letter = get_column_letter(idx)

            # 计算列宽（基于内容长度）
            max_length = 0
            column_data = filtered_df[col].astype(str)

            # 计算表头宽度
            header_length = len(str(col))
            max_length = max(max_length, header_length)

            # 计算内容最大宽度
            content_length = column_data.str.len().max()
            max_length = max(max_length, content_length)

            # 设置列宽（添加一些边距）
            adjusted_width = min(max_length + 4, 50)  # 最大宽度限制为50
            worksheet.column_dimensions[column_letter].width = adjusted_width

        # 创建样式对象
        center_alignment = Alignment(
            horizontal="center", vertical="center", wrap_text=True
        )
        bold_font = Font(bold=True, size=12)
        header_fill = PatternFill(
            start_color="D3D3D3", end_color="D3D3D3", fill_type="solid"
        )
        thin_border = Border(
            left=Side(style="thin"),
            right=Side(style="thin"),
            top=Side(style="thin"),
            bottom=Side(style="thin"),
        )

        # 设置所有单元格居中对齐和边框
        for row in worksheet.iter_rows(
            min_row=1,
            max_row=len(filtered_df) + 1,
            min_col=1,
            max_col=len(filtered_df.columns),
        ):
            for cell in row:
                cell.alignment = center_alignment
                cell.border = thin_border

        # 设置表头样式
        for cell in worksheet[1]:
            cell.font = bold_font
            cell.fill = header_fill

        # 保存修改后的文件
        workbook.save(output_path)

    except Exception as e:
        raise ValueError(f"保存结果文件失败: {e}")

    print(f"筛选完成: 共找到 {len(filtered_df)} 条匹配记录")
    print(f"输出文件: {output_path}")

    return output_path
